﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Entidad;
using SegIdenPC.Herramientas;
using log4net;
using GS1.Utilitario;
using System.Drawing.Imaging;
using System.Configuration;

namespace SegIdenPC.Formularios
{
    public partial class frmMantSolicitud : Form
    {

        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmMantSolicitud));

        private const string TITULO = "Mantenimiento de Solicitudes de Transferencias";
        private const string FORMATO_TOTAL_ENCONTRADOS = "Total productos encontrados: {0}";

        public enum OperacionMantenimiento
        {
            Nuevo,
            Editar
        }

        private OperacionMantenimiento tipoOperacion = OperacionMantenimiento.Nuevo;

        private enum Opcion
        {
            Abrir = 0,
            Nuevo = 1,
            Editar = 2,
            Grabar = 3,
            Atendido = 4,
            Cancelar = 5,
            Generar = 6
        }

        private Solicitud solicitudActual = null;

        private ListaTienda listaTienda = null;

        private ListaSolicitud listaSolicitud = null;

        private const string FORMATO_PRODUCTO_DESCRIPCION_DETALLADA = "{0} - {1} - {2} - {3}";

        private Tienda tiendaOrigenActual = null;
        private Tienda tiendaDestinoActual = null;

        private Producto producto = null;

        #endregion

        #region --- Constructor ---
        public frmMantSolicitud()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmMantSolicitud_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
        {
            if (!e.TabPage.Enabled) { e.Cancel = true; }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            buscarSolicitud();
        }

        private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }

        private void tbtnAbrir_Click(object sender, EventArgs e)
        {
            abrir();
        }

        private void tbtnEditar_Click(object sender, EventArgs e)
        {
            editar();
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            agregarProducto();
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            quitarProducto();
        }

        private void btnBuscarProducto_Click(object sender, EventArgs e)

        {
            elegirProducto();
        }

        private void btnBuscarTiendaD_Click(object sender, EventArgs e)
        {
            elegirTiendaDestino();
        }

        private void btnBuscarTiendaO_Click(object sender, EventArgs e)
        {
            elegirTiendaOrigen();
        }

        private void cboEstado_SelectedIndexChanged(object sender, EventArgs e)
        {
            //cambioEstado();
        }

        private void tbtnNuevo_Click(object sender, EventArgs e)
        {
            nuevo();
        }

        private void tbtnGrabar_Click(object sender, EventArgs e)
        {
            grabar();
        }
        private void tbtnCancelar_Click(object sender, EventArgs e)
        {
            cancelar();
        }


        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            ListaGeneral listaEstado = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Activaciones de botones por rol
                controlBotonesPorRol();

                // Instanciando y creando listado de estado
                listaEstado = new ListaGeneral();
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_PENDIENTE, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PENDIENTE });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_AUTORIZADO, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_AUTORIZADO });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_RECEPCIONADO, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_PARCIAL , descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_DESPACHADO, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO });

                //Instanciando y creando listado de país
                listaTienda = new ListaTienda();

                // Desactivando el grupo de campo de informacion
                this.tabPagDatos.Enabled = false;
                // Estableciendo Ficha 0 como seleccion incial
                this.tabControl.SelectedIndex = 0;
                // Capturando evento selecting en el control Tab
                this.tabControl.Selecting += new TabControlCancelEventHandler(tabControl_Selecting);

                // Estableciendo a 0 el texto del total de registros encontrados.
                this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, 0);

                // Desactivando el boton abrir.
                this.tbtnAbrir.Enabled = false;

                // Estableciendo datos del combo Estado
                this.cboEstado.DataSource = listaEstado;
                this.cboEstado.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboEstado.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboEstado.SelectedIndex = 0;

                //Estableciendo lista de tiendas
                cargarTiendas();

                // Estableciendo tienda de destino
                this.tiendaDestinoActual = ParametrosAplicacion.TIENDA_ACTUAL;
                this.txtTiendaDCodigo.Text = this.tiendaDestinoActual.codigo;
                this.txtTiendaDDescripcion.Text = this.tiendaDestinoActual.nombre;

                this.dtpFechaVencimiento.Value = DateTime.Now;

                // Estableciendo focus

                this.cboCriterio.Focus();

            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }

        }

        private void cargarTiendas()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_TIENDAS;

            operacion.tienda = new Tienda();
            operacion.tienda.nombre = "%";
            operacion.tienda.estado = Constantes.ESTADO_CODIGO_ACTIVO;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de ListaTienda
            this.listaTienda = contenidoXML.DeserializarTo<ListaTienda>();

            // Estableciendo listado de Tienda
            this.cboCriterio.DataSource = this.listaTienda.lista;
            this.cboCriterio.ValueMember = "codigo";
            this.cboCriterio.DisplayMember = "nombre";
            this.cboCriterio.SelectedIndex = 0;

            // Creando listado para registro de Tienda
            ListaTienda listaTiendaNueva = new ListaTienda();

            foreach (Tienda tienda in this.listaTienda.lista)
            {
                listaTiendaNueva.add(new Tienda { codigo = tienda.codigo, nombre = tienda.nombre });
            }

        }

        private void finalizarFormulario()
        {
            this.tabControl.Selecting -= new TabControlCancelEventHandler(tabControl_Selecting);
        }

        private void controlBotonesPorRol()
        {
            if (ParametrosAplicacion.ROL_ADMINISTRADOR.codigo.Equals(ParametrosAplicacion.USUARIO_ACTUAL.rol.codigo)) { return; }

            this.tbtnNuevo.Visible = false;
            this.tbtnEditar.Visible = false;
            //this.tbtnEliminar.Visible = false;
            this.tbtnGrabar.Visible = false;
        }

        private void elegirTiendaOrigen()
        {
            using (frmMantTienda frmMantTienda = new frmMantTienda())
            {
                frmMantTienda.formularioBusqueda = true;
                if (frmMantTienda.ShowDialog() == DialogResult.Cancel) { return; }

                this.tiendaOrigenActual = frmMantTienda.tiendaActual;
                this.txtTiendaOCodigo.Text = this.tiendaOrigenActual.codigo;
                this.txtTiendaODescripcion.Text = this.tiendaOrigenActual.nombre;
            }
        }

        private void elegirTiendaDestino()
        {
            using (frmMantTienda frmMantTienda = new frmMantTienda())
            {
                frmMantTienda.formularioBusqueda = true;
                if (frmMantTienda.ShowDialog() == DialogResult.Cancel) { return; }

                this.tiendaDestinoActual = frmMantTienda.tiendaActual;
                this.txtTiendaDCodigo.Text = this.tiendaDestinoActual.codigo;
                this.txtTiendaDDescripcion.Text = this.tiendaDestinoActual.nombre;
            }
        }

        private void elegirProducto()
        {
            using (frmMantProducto frmMantProducto = new frmMantProducto())
            {
                frmMantProducto.formularioBusqueda = true;
                if (frmMantProducto.ShowDialog() == DialogResult.Cancel) { return; }

                this.producto = frmMantProducto.productoActual;

                // Cargar datos del producto
                obtenerProductoDetalle();
            }
        }

        private void obtenerProductoDetalle()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_OBTENER_PRODUCTO;
                operacion.producto = new Producto { codigo = this.producto.codigo };
                operacion.tienda = new Tienda();
                operacion.tienda = this.tiendaOrigenActual;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                // Obteniendo Objeto de Producto
                Producto producto = contenidoXML.DeserializarTo<Producto>();

                // Mostrar los datos del producto
                this.producto = producto;
                this.txtProductoCodigo.Text = producto.codigo;
                this.txtProductoDescripcion.Text = string.Format(FORMATO_PRODUCTO_DESCRIPCION_DETALLADA, producto.nivelProducto.descripcion,
                                                                                                         producto.nivelTipo.descripcion,
                                                                                                         producto.nivelMaterial.descripcion,
                                                                                                         producto.nivelColor.descripcion);
                
                this.txtProductoStockActual.Text = producto.cantidadDisponible.ToString();
                this.txtCantidad.Text = "0";
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void nuevo()
        {
            //this.tbtnGrabar.Enabled = true;

            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false;
            this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            this.grpDatos.Enabled = true;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Nuevo);

            this.tipoOperacion = OperacionMantenimiento.Nuevo;

            // Estableciendo focus control txtDescripcion
            this.btnBuscarTiendaO.Focus();

            // Limpiando los datos del formulario
            this.txtCodigo.Text = string.Empty;
            this.txtTiendaOCodigo.Text = string.Empty;
            this.txtTiendaODescripcion.Text = string.Empty;
            this.txtTiendaDCodigo.Text = string.Empty;
            this.txtTiendaDDescripcion.Text = string.Empty;

            this.dtpFechaVencimiento.Value = DateTime.Now;
            this.txtObservacion.Text = string.Empty;

            this.txtProductoCodigo.Text = string.Empty;
            this.txtProductoDescripcion.Text = string.Empty;

            this.txtProductoStockActual.Text = Constantes.VALOR_CERO;
            this.txtCantidad.Text = Constantes.VALOR_CERO;

            // Limpiando grilla de detalle de la Solicitud
            ListPersonalizada<LineaSolicitud> listaLineaSolicitud = (ListPersonalizada<LineaSolicitud>)this.dgvListado.DataSource;

            if (listaLineaSolicitud != null)
                {
                    listaLineaSolicitud.Clear();

                    this.dgvListado.DataSource = null;
                    this.dgvListado.DataSource = listaLineaSolicitud;
                }

            this.cboEstado.Enabled = true;
            this.btnBuscarTiendaO.Enabled = true;
            this.btnBuscarTiendaD.Enabled = true;
            this.dtpFechaVencimiento.Enabled = true;
            this.txtObservacion.Enabled = true;
            this.btnBuscarProducto.Enabled = true;
            this.txtCantidad.Enabled = true;
            this.btnAgregar.Enabled = true;
            this.btnEliminar.Enabled = true;

        }

        private void grabar()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                if (validarEntrada()) { return; }

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                
                operacion.solicitud = new Solicitud();
                

                // Estableciendo proveedor del OC
                operacion.solicitud.tiendaOrigen = new Tienda();
                operacion.solicitud.tiendaOrigen.codigo = this.tiendaOrigenActual.codigo;
                operacion.solicitud.tiendaOrigen.nombre = this.tiendaOrigenActual.nombre;

                // Estableciendo proveedor del OC
                operacion.solicitud.tiendaDestino = new Tienda();
                operacion.solicitud.tiendaDestino.codigo = this.tiendaDestinoActual.codigo;
                operacion.solicitud.tiendaDestino.nombre = this.tiendaDestinoActual.nombre;

                // Estableciendo el tipo de solicitud
                operacion.solicitud.tipo = Constantes.CODIGO_TIPO_SOLICITUD_NORMAL;

                // Estableciendo usuario de registro
                operacion.solicitud.usuario = new Usuario();
                operacion.solicitud.usuario.codUsuario = ParametrosAplicacion.USUARIO_ACTUAL.codUsuario;

                operacion.solicitud.fechaVencimiento = this.dtpFechaVencimiento.Value.ToString(Constantes.FORMATO_FECHAHORA);
                operacion.solicitud.observacion = this.txtObservacion.Text;
                operacion.solicitud.estado = this.cboEstado.SelectedValue.ToString();
                operacion.solicitud.usuarioAprovacion = new Usuario();
                operacion.solicitud.usuarioAprovacion = ParametrosAplicacion.USUARIO_ACTUAL;
                
                operacion.solicitud.fechaRegistro = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);

                operacion.solicitud.listaLineaSolicitud = new ListaLineaSolicitud();
                operacion.solicitud.listaLineaSolicitud.lista = (ListPersonalizada<LineaSolicitud>)this.dgvListado.DataSource;

                if (tipoOperacion == OperacionMantenimiento.Nuevo)
                {
                    operacion.solicitud.codSolicitud = Constantes.VALOR_CERO;
                    operacion.numero = Constantes.OPERACION_REGISTRAR_SOLICITUD;
                }
                else if (tipoOperacion == OperacionMantenimiento.Editar)
                {
                    operacion.solicitud.codSolicitud = this.txtCodigo.Text;
                    operacion.numero = Constantes.OPERACION_MODIFICAR_SOLICITUD;

                    if (cboEstado.Text.Equals(Constantes.ESTADO_DOCUMENTO_DESCRIPCION_AUTORIZADO))
                    {
                        operacion.solicitud.fechaAprovacion = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);
                    }

                    
                }

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    this.txtCodigo.Text = operacionResultado.codigoGenerado;
                    Libreria.ShowMessageboxInfo("Registro guardado correctamente", TITULO);
                }
                else
                {
                    Libreria.ShowMessageboxError("No se guardo los datos", TITULO);
                    return;
                }

                // Estableciendo los estados de los botones
                this.grpDatos.Enabled = false;
                // Estableciendo estado de TagPage de Listado y datos
                this.tabPagListado.Enabled = true;
                this.tabPagDatos.Enabled = false;
                // Mostrar la primera pagina del TabControl
                this.tabControl.SelectedIndex = 0;

                buscarSolicitud();

                // Estableciendo los estados de los botones
                cambiarEstadoBotones(Opcion.Generar);

            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private bool validarEntrada()
        {
            bool resultado = false;

            this.txtObservacion.Text = this.txtObservacion.Text.Trim();
            this.txtTiendaOCodigo.Text = this.txtTiendaOCodigo.Text.Trim();
            this.txtTiendaDCodigo.Text = this.txtTiendaDCodigo.Text.Trim();

            if (this.txtTiendaOCodigo.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtTiendaOCodigo, "Debe elegir una Tienda de Origén", TITULO);
                return true;
            }

            if (this.txtTiendaDCodigo.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtTiendaDCodigo, "Debe elegir una Tienda de Destino", TITULO);
                return true;
            }

            if (this.txtTiendaOCodigo.Text.Equals(this.txtTiendaDCodigo.Text))
            {
                Libreria.CampoNecesario(this.txtTiendaOCodigo, "La Tienda de Origen debe ser diferente a la Tienda Destino", TITULO);
                return true;
            }

            if (this.txtObservacion.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtObservacion, "Debe ingresar el campo Observación", TITULO);
                return true;
            }

            ListPersonalizada<LineaSolicitud> listaLineaSolicitud = (ListPersonalizada<LineaSolicitud>)this.dgvListado.DataSource;

            if ((listaLineaSolicitud == null) || (listaLineaSolicitud.Count == 0))
            {
                Libreria.CampoNecesario(this.dgvListado, "Debe ingresar por lo menos un producto a la Solicitud", TITULO);
                return true;
            }

            return resultado;
        }

        private bool validaEntradaProducto()
        {
            bool resultado = false;
            this.txtProductoCodigo.Text = this.txtProductoCodigo.Text.Trim();
            this.txtProductoStockActual.Text = this.txtProductoStockActual.Text.Trim();
            this.txtCantidad.Text = this.txtCantidad.Text.Trim();

            if (this.txtProductoCodigo.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtProductoCodigo, "Debe elegir el producto solicitado", TITULO);
                return true;
            }

            if ((this.txtProductoStockActual.Text.EsEnteroConSigno()) &&
                (this.txtProductoStockActual.Text.ToEntero() <= 0))
            {
                Libreria.CampoNecesario(this.txtProductoStockActual, "No hay stock disponible para el producto seleccionado", TITULO);
                return true;
            }

            if (this.txtCantidad.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtCantidad, "Debe ingresar el campo Cantidad del producto", TITULO);
                return true;
            }

            if ((this.txtCantidad.Text.EsEnteroConSigno()) &&
                (this.txtCantidad.Text.ToEntero() <= 0))
            {
                Libreria.CampoNecesario(this.txtCantidad, "Debe ingresar una Cantidad mayor a cero", TITULO);
                return true;
            }

            return resultado;
        }

        private void agregarProducto()
        {
          try
           {
              if (validaEntradaProducto()) { return; }

                   if (validarProductoRepetido(this.producto.codigo))
                     {
                         Libreria.CampoNecesario(this.txtProductoCodigo, "Este producto ya se encuentra asociado a la solicitud", TITULO);
                         return;
                     }

                    // Obteniendo lista de lineas
                    ListPersonalizada<LineaSolicitud> listaLineaSolicitud = (ListPersonalizada<LineaSolicitud>)this.dgvListado.DataSource;
                    if (listaLineaSolicitud == null) { listaLineaSolicitud = new ListPersonalizada<LineaSolicitud>(); }

                    // Instanciando linea
                    LineaSolicitud lineaSolicitud = new LineaSolicitud();

                    // Estableciendo el producto
                    lineaSolicitud.producto = new Producto();
                    lineaSolicitud.producto = this.producto;
                    lineaSolicitud.producto.codigo = this.producto.codigo;
                    lineaSolicitud.producto.descripcion = this.txtProductoDescripcion.Text;

                    // Estableciendo la cantidad del producto
                    lineaSolicitud.cantidad = this.txtCantidad.Text;

                    if (Convert.ToInt32(this.txtCantidad.Text) > Convert.ToInt32(this.txtProductoStockActual.Text))
                    {
                        Libreria.ShowMessageboxInfo("La cantida solicitada excede el estock en tienda", TITULO);
                        return;
                    }

                    // Agregando contacto
                    listaLineaSolicitud.Add(lineaSolicitud);

                    // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                    this.dgvListado.AutoGenerateColumns = false;

                    // Actualizando en grilla
                    this.dgvListado.DataSource = null;
                    this.dgvListado.DataSource = listaLineaSolicitud;

                    formatearGrilla();
                }
                catch (Exception ex)
                {
                    log.Error(ex.Message, ex);
                    Libreria.MensajeError(ex, TITULO);
                }
            }             
       

        private void quitarProducto()
        {
            try
            {
                // Obteniendo lista de LineaSolicitud
                ListPersonalizada<LineaSolicitud> listaLineaSolicitud = (ListPersonalizada<LineaSolicitud>)this.dgvListado.DataSource;

                if (listaLineaSolicitud != null && listaLineaSolicitud.Count > 0)
                {
                    // Obteniedo la linea seleccionada
                    LineaSolicitud lineaSolicitud = listaLineaSolicitud[this.dgvListado.CurrentRow.Index];

                    // Eliminando linea de la OC
                    listaLineaSolicitud.Remove(lineaSolicitud);

                    // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                    this.dgvListado.AutoGenerateColumns = false;

                    // Actualizando en grilla
                    this.dgvListado.DataSource = null;
                    this.dgvListado.DataSource = listaLineaSolicitud;

                    formatearGrilla();
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void formatearGrilla()
        {
            ListPersonalizada<LineaSolicitud> listaLineaSolicitud = null;
            listaLineaSolicitud = (ListPersonalizada<LineaSolicitud>)this.dgvListado.DataSource;

            if (listaLineaSolicitud != null)
            {
                for (int i = 0; i < listaLineaSolicitud.Count; i++)
                {
                    var lineaSolicitud = listaLineaSolicitud[i];

                    this.dgvListado.Rows[i].Cells[0].Value = lineaSolicitud.producto.codigo;
                    this.dgvListado.Rows[i].Cells[1].Value = lineaSolicitud.producto.codProductoProveedor;
                    this.dgvListado.Rows[i].Cells[2].Value = lineaSolicitud.producto.descripcion;
                }
            }
        }

        private bool validarProductoRepetido(string codProducto)
        {
            bool resultato = false;

            // Obteniendo lista de lineas
            ListPersonalizada<LineaSolicitud> listaLineaSolicitud = (ListPersonalizada<LineaSolicitud>)this.dgvListado.DataSource;

            if (listaLineaSolicitud != null)
            {
                foreach (LineaSolicitud item in listaLineaSolicitud)
                {
                    if (item.producto.codigo.Equals(codProducto))
                    {
                        resultato = true;
                        break;
                    }
                }
            }

            return resultato;
        }

        private void salir()
        {
            this.Close();
        }

        private void buscarSolicitud()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_SOLICITUDES;

            operacion.solicitud = new Solicitud();
            operacion.solicitud.tiendaOrigen = new Tienda();
            operacion.solicitud.tiendaOrigen.codigo = this.cboCriterio.SelectedValue.ToString();
            //operacion.solicitud.estado = Constantes.ESTADO_DOCUMENTO_PENDIENTE;
            operacion.solicitud.tipo = Constantes.CODIGO_TIPO_SOLICITUD_NORMAL;


            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de la lista de solicitudes pendientes de autorizacion
            this.listaSolicitud = contenidoXML.DeserializarTo<ListaSolicitud>();

            // Mostrar el total de registros encontrados
            this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, listaSolicitud.lista.Count);

            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListadoSolicitudes.AutoGenerateColumns = false;

            // Se establece la fuente de datos de la grilla
            this.dgvListadoSolicitudes.DataSource = listaSolicitud.lista;

            // Activando o desactivando boton Abrir
            this.tbtnAbrir.Enabled = listaSolicitud.lista.Count > 0;

            // Colorear grilla deacuerdo a criterios
            pintarGrilla(dgvListadoSolicitudes);

        }

        private void pintarGrilla(DataGridView grilla)
        {
            ListPersonalizada<Solicitud> listaSolicitud = null;
            listaSolicitud = (ListPersonalizada<Solicitud>)grilla.DataSource;

            if (listaSolicitud != null)
            {
                for (int i = 0; i < listaSolicitud.Count; i++)
                {
                    Solicitud solicitud = listaSolicitud[i];

                    grilla.Rows[i].Cells[0].Value = solicitud.codSolicitud;
                    grilla.Rows[i].Cells[1].Value = solicitud.tiendaDestino.nombre;
                    grilla.Rows[i].Cells[2].Value = Convert.ToDateTime(solicitud.fechaVencimiento).ToString(Constantes.FORMATO_FECHA);
                    switch (solicitud.estado)
                    {

                        case Constantes.ESTADO_DOCUMENTO_DESPACHADO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_DEVUELTO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DEVUELTO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_IMPRESO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_IMPRESO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_PARCIAL:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_PENDIENTE:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PENDIENTE;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_RECEPCIONADO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_AUTORIZADO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_AUTORIZADO;
                                break;
                            }
                    }


                    if (solicitud.estado.Equals(Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO) ||
                 solicitud.estado.Equals(Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO) ||
                 solicitud.estado.Equals(Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL) ||
                 solicitud.estado.Equals(Constantes.ESTADO_DOCUMENTO_DESCRIPCION_IMPRESO) ||
                 solicitud.estado.Equals(Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DEVUELTO))
                    {
                        this.dgvListadoSolicitudes.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(255, 128, 128);
                    }
                }
            }
        }

        private void abrir()
        {

            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false; 
            this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Abrir);

            // Valida si seleccione algun equipos
            if (this.dgvListadoSolicitudes.CurrentRow != null && this.dgvListadoSolicitudes.CurrentRow.Index > -1)
            {
                ListPersonalizada<Solicitud> listaSolicitud = (ListPersonalizada<Solicitud>)this.dgvListadoSolicitudes.DataSource;
                this.solicitudActual = obtenerSolicitud(listaSolicitud[this.dgvListadoSolicitudes.CurrentRow.Index]);
            
                this.txtCodigo.Text = solicitudActual.codSolicitud;

                this.tiendaOrigenActual = solicitudActual.tiendaOrigen;
                this.txtTiendaOCodigo.Text = solicitudActual.tiendaOrigen.codigo.ToString();
                this.txtTiendaODescripcion.Text = solicitudActual.tiendaOrigen.nombre;

                this.tiendaDestinoActual = solicitudActual.tiendaDestino;
                this.txtTiendaDCodigo.Text = solicitudActual.tiendaDestino.codigo.ToString();
                this.txtTiendaDDescripcion.Text = solicitudActual.tiendaDestino.nombre;
                
                this.dtpFechaVencimiento.Text = Convert.ToDateTime(solicitudActual.fechaVencimiento).ToString(Constantes.FORMATO_FECHA);
                this.txtObservacion.Text = solicitudActual.observacion;

                // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                this.dgvListado.AutoGenerateColumns = false;

                // Se establece fuente de datos
                this.dgvListado.DataSource = solicitudActual.listaLineaSolicitud.lista == null ?
                                                        new ListPersonalizada<LineaSolicitud>() :
                                                        solicitudActual.listaLineaSolicitud.lista;

                formatearGrilla();

                switch (solicitudActual.estado)
                {
                    case Constantes.ESTADO_DOCUMENTO_PENDIENTE:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PENDIENTE;
                        break;
                    case Constantes.ESTADO_DOCUMENTO_AUTORIZADO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_AUTORIZADO;
                        break;
                    case Constantes.ESTADO_DOCUMENTO_DESPACHADO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_PARCIAL:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_IMPRESO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_IMPRESO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_DEVUELTO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DEVUELTO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_RECEPCIONADO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                }          
              
                this.cboEstado.Enabled = false;
                this.btnBuscarTiendaO.Enabled = false;
                this.btnBuscarTiendaD.Enabled = false;
                this.dtpFechaVencimiento.Enabled = false;
                this.txtObservacion.Enabled = false;
                this.btnBuscarProducto.Enabled = false;
                this.txtCantidad.Enabled = false;
                this.btnAgregar.Enabled = false;
                this.btnEliminar.Enabled = false;
 
                if (solicitudActual.listaLineaSolicitud.lista.Count == 0)
                {
                    Libreria.ShowMessageboxInfo("Esta solicitud es de bultos, para ver el contenido vaya al menú solicitud bultos", TITULO);
                    // Estableciendo estado de TagPage de Listado y datos
                    this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

                    // Mostrar la primera pagina del TabControl
                    this.tabControl.SelectedIndex = 0;

                    // Deshabilitando el grupoBox de datos
                    this.grpDatos.Enabled = false;

                    // Estableciendo los estados de los botones
                   // cambiarEstadoBotones(Opcion.Cancelar);

                    // Estableciendo focus
                    this.btnBuscar.Focus();

                }
            }
        }

        private void habilitarBotones(Boolean activar)
        {
            if (activar)
            {
                this.cboEstado.Enabled = true;
                this.btnBuscarTiendaO.Enabled = true;
                this.btnBuscarTiendaD.Enabled = true;
                this.dtpFechaVencimiento.Enabled = true;
                this.txtObservacion.Enabled = true;
                this.btnBuscarProducto.Enabled = true;
                this.txtCantidad.Enabled = true;
                this.btnAgregar.Enabled = true;
                this.btnEliminar.Enabled = true;
            }
            else
            {
                this.cboEstado.Enabled = false;
                this.btnBuscarTiendaO.Enabled = false;
                this.btnBuscarTiendaD.Enabled = false;
                this.dtpFechaVencimiento.Enabled = false;
                this.txtObservacion.Enabled = false;
                this.btnBuscarProducto.Enabled = false;
                this.txtCantidad.Enabled = false;
                this.btnAgregar.Enabled = false;
                this.btnEliminar.Enabled = false;
            }
        }

        private void cambiarEstadoBotones(Opcion tipoOpcion)
        {
            switch (tipoOpcion)
            {
                case Opcion.Abrir:
                    this.tbtnEditar.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    break;
                case Opcion.Nuevo:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    break;
                case Opcion.Editar:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    break;
                case Opcion.Grabar:
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnEditar.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    break;
                case Opcion.Atendido:
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    break;
                case Opcion.Cancelar:
                    this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnCancelar.Enabled = false;
                    break;
                case Opcion.Generar:
                    this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    break;
            }
        }

        private Solicitud obtenerSolicitud (Solicitud solicitud)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_SOLICITUD;
            operacion.solicitud = solicitud;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return solicitud;
            }

            // Obteniendo Objeto de Producto
            Solicitud solicitudObtenido = contenidoXML.DeserializarTo<Solicitud>();

            return solicitudObtenido;

        }

        /*private void cambioEstado()
        {
            if (this.cboEstado.SelectedValue.ToString().Equals(Constantes.ESTADO_DOCUMENTO_DESPACHADO) ||
                this.cboEstado.SelectedValue.ToString().Equals(Constantes.ESTADO_DOCUMENTO_PARCIAL) ||
                this.cboEstado.SelectedValue.ToString().Equals(Constantes.ESTADO_DOCUMENTO_RECEPCIONADO))
            {
                this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PENDIENTE;
            }

        }*/

        private void editar()
        {
            /*if (this.solicitudActual.estado.Equals(Constantes.ESTADO_DOCUMENTO_DESPACHADO) ||
                this.solicitudActual.estado.Equals(Constantes.ESTADO_DOCUMENTO_RECEPCIONADO) ||
                this.solicitudActual.estado.Equals(Constantes.ESTADO_DOCUMENTO_PARCIAL) ||
                this.solicitudActual.estado.Equals(Constantes.ESTADO_DOCUMENTO_AUTORIZADO) ||
                this.solicitudActual.estado.Equals(Constantes.ESTADO_DOCUMENTO_IMPRESO) ||
                this.solicitudActual.estado.Equals(Constantes.ESTADO_DOCUMENTO_DEVUELTO))
            {
                Libreria.ShowMessageboxInfo("La solicitud ya ha sido atendida, no se pueden realizar cambios", TITULO);
                return;
            }*/


            this.grpDatos.Enabled = true;
            this.cboEstado.Enabled = true;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Editar);

            this.tipoOperacion = OperacionMantenimiento.Editar;

            // Estableciendo focus control
            this.cboEstado.Focus();

            this.cboEstado.Enabled = true;
            this.btnBuscarTiendaO.Enabled = true;
            this.btnBuscarTiendaD.Enabled = true;
            this.dtpFechaVencimiento.Enabled = true;
            this.txtObservacion.Enabled = true;
            this.btnBuscarProducto.Enabled = true;
            this.txtCantidad.Enabled = true;
            this.btnAgregar.Enabled = true;
            this.btnEliminar.Enabled = true;

        }
        private void cancelar()
        {
            if ((this.tipoOperacion == OperacionMantenimiento.Editar) ||
                     (!this.grpDatos.Enabled))
            {
                this.btnBuscar.Focus();
            }

            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

            // Mostrar la primera pagina del TabControl
            this.tabControl.SelectedIndex = 0;

            // Deshabilitando el grupoBox de datos
            this.grpDatos.Enabled = false;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Cancelar);

            // Estableciendo focus
            this.btnBuscar.Focus();

        }
        #endregion

        private void cboCriterio_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {

        }




















        


    }
}
